#pragma once

/* 基础函数 */
/* 取第一个参数 */
#define HD(x, ...)			x
#define SND(_, y, ...)			y

/* 保留除头部以外的参数 */
#define EXC_HD(x, ...)			__VA_ARGS__


#define __DO_NOTHING			__EMPTY

/* 控制求值顺序来定义高级操作 */
#define __EMPTY(...)
/* 推迟求值, 光标右移 */
#define DEFER(f)			f __EMPTY()
#define OBSTRUCT(...)			__VA_ARGS__ DEFER(__EMPTY)()
#define EXPAND(...)			__VA_ARGS__

/* next */

#define HALT(...)			__VA_ARGS__


/* 递归求值 */
#define EVAL0(...)			__VA_ARGS__
#define EVAL1(...)			EVAL0( EVAL0 ( EVAL0 ( __VA_ARGS__ )))
#define EVAL2(...)			EVAL1( EVAL1 ( EVAL1 ( __VA_ARGS__ )))
#define EVAL3(...)			EVAL2( EVAL2 ( EVAL2 ( __VA_ARGS__ )))
#define EVAL4(...)			EVAL3( EVAL3 ( EVAL3 ( __VA_ARGS__ )))
#define EVAL(...)			EVAL4(__VA_ARGS__)

#define PARENS				()
/* 原理是永远取第二个值，如果有参数，那么选的就是0 */
#define __CHECK(...)			SND(__VA_ARGS__, 0,)
#define __PROBE(x)			x, 1,



// /* 递归求值确保能停机的标识符 */
// /* 顺序递归没有问题， 逆序递归需要用这个*/
#define EVAL_STEP(...)			__EVAL_STEP0(__VA_ARGS__)
#define __EVAL_STEP0(...)		__EVAL_STEP1(__VA_ARGS__)
#define __EVAL_STEP1(...)		__EVAL_STEP2(__VA_ARGS__)
#define __EVAL_STEP2(...)		__EVAL_STEP3(__VA_ARGS__)
#define __EVAL_STEP3(...)		__EVAL_STEP4(__VA_ARGS__)
#define __EVAL_STEP4(...)		__EVAL_STEP5(__VA_ARGS__)
#define __EVAL_STEP5(...)		__EVAL_STEP6(__VA_ARGS__)
#define __EVAL_STEP6(...)		__EVAL_STEP7(__VA_ARGS__)
#define __EVAL_STEP7(...)		__EVAL_STEP8(__VA_ARGS__)
#define __EVAL_STEP8(...)		__EVAL_STEP9(__VA_ARGS__)
#define __EVAL_STEP9(...)		__EVAL_STEP10(__VA_ARGS__)
#define __EVAL_STEP10(...)		__EVAL_STEP11(__VA_ARGS__)
#define __EVAL_STEP11(...)		__EVAL_STEP12(__VA_ARGS__)
#define __EVAL_STEP12(...)		__EVAL_STEP13(__VA_ARGS__)
#define __EVAL_STEP13(...)		__EVAL_STEP14(__VA_ARGS__)
#define __EVAL_STEP14(...)		__EVAL_STEP15(__VA_ARGS__)
#define __EVAL_STEP15(...)		__EVAL_STEP16(__VA_ARGS__)
#define __EVAL_STEP16(...)		HALT(__VA_ARGS__)

// #define __EVAL_STEP()			 EVAL_STEP

// #define CONTINUE(k)			   _SEQ, DEFER(k##_HOOK)()
// #define STOP(_k_cx, ...)		 _END, __VA_ARGS__
// #define STOP_HOOK()			   STOP

// #define NEXT(next_lvl, choice)      REC_NEXT_##choice(next_lvl)
// #define NEXT_SEQ(next_lvl)          REC_##next_lvl
// #define NEXT_END(_next_lvl)         HALT


// #define REC_0(choice, ...)    REC_NEXT(1, choice)(__VA_ARGS__)
// #define REC_1(choice, ...)    REC_NEXT(2, choice)(__VA_ARGS__)
// #define REC_2(choice, ...)    REC_NEXT(3, choice)(__VA_ARGS__)
// #define REC_3(choice, ...)    REC_NEXT(4, choice)(__VA_ARGS__)
// #define REC_4(choice, ...)    REC_NEXT(5, choice)(__VA_ARGS__)
// #define REC_5(choice, ...)    REC_NEXT(6, choice)(__VA_ARGS__)
// #define REC_6(choice, ...)    REC_NEXT(7, choice)(__VA_ARGS__)
// #define REC_7(choice, ...)    REC_NEXT(8, choice)(__VA_ARGS__)
// #define REC_8(choice, ...)    REC_NEXT(9, choice)(__VA_ARGS__)
// #define REC_9(choice, ...)    REC_NEXT(10, choice)(__VA_ARGS__)
// #define REC_10(choice, ...)   REC_NEXT(11, choice)(__VA_ARGS__)
// #define REC_11(choice, ...)   REC_NEXT(12, choice)(__VA_ARGS__)
// #define REC_12(choice, ...)   REC_NEXT(13, choice)(__VA_ARGS__)
// #define REC_13(choice, ...)   REC_NEXT(14, choice)(__VA_ARGS__)
// #define REC_14(choice, ...)   REC_NEXT(15, choice)(__VA_ARGS__)
// #define REC_15(choice, ...)   REC_NEXT(16, choice)(__VA_ARGS__)
// #define REC_16(choice, ...)   REC_NEXT(17, choice)(__VA_ARGS__)
// #define REC_17(choice, ...)   REC_NEXT(18, choice)(__VA_ARGS__)
// #define REC_18(choice, ...)   REC_NEXT(19, choice)(__VA_ARGS__)
// #define REC_19(choice, ...)   REC_NEXT(20, choice)(__VA_ARGS__)
// #define REC_20(choice, ...)   REC_NEXT(21, choice)(__VA_ARGS__)
// #define REC_21(choice, ...)   REC_NEXT(22, choice)(__VA_ARGS__)
// #define REC_22(choice, ...)   REC_NEXT(23, choice)(__VA_ARGS__)
// #define REC_23(choice, ...)   REC_NEXT(24, choice)(__VA_ARGS__)
// #define REC_24(choice, ...)   REC_NEXT(25, choice)(__VA_ARGS__)
// #define REC_25(choice, ...)   REC_NEXT(26, choice)(__VA_ARGS__)
// #define REC_26(choice, ...)   REC_NEXT(27, choice)(__VA_ARGS__)
// #define REC_27(choice, ...)   REC_NEXT(28, choice)(__VA_ARGS__)
// #define REC_28(choice, ...)   REC_NEXT(29, choice)(__VA_ARGS__)
// #define REC_29(choice, ...)   REC_NEXT(30, choice)(__VA_ARGS__)
// #define REC_30(choice, ...)   REC_NEXT(31, choice)(__VA_ARGS__)
// #define REC_31(choice, ...)   REC_NEXT(32, choice)(__VA_ARGS__)
// #define REC_32(choice, ...)   REC_NEXT(33, choice)(__VA_ARGS__)
// #define REC_33(choice, ...)   REC_NEXT(34, choice)(__VA_ARGS__)
// #define REC_34(choice, ...)   REC_NEXT(35, choice)(__VA_ARGS__)
// #define REC_35(choice, ...)   REC_NEXT(36, choice)(__VA_ARGS__)
// #define REC_36(choice, ...)   REC_NEXT(37, choice)(__VA_ARGS__)
// #define REC_37(choice, ...)   REC_NEXT(38, choice)(__VA_ARGS__)
// #define REC_38(choice, ...)   REC_NEXT(39, choice)(__VA_ARGS__)
// #define REC_39(choice, ...)   REC_NEXT(40, choice)(__VA_ARGS__)
// #define REC_40(choice, ...)   REC_NEXT(41, choice)(__VA_ARGS__)
// #define REC_41(choice, ...)   REC_NEXT(42, choice)(__VA_ARGS__)
// #define REC_42(choice, ...)   REC_NEXT(43, choice)(__VA_ARGS__)
// #define REC_43(choice, ...)   REC_NEXT(44, choice)(__VA_ARGS__)
// #define REC_44(choice, ...)   REC_NEXT(45, choice)(__VA_ARGS__)
// #define REC_45(choice, ...)   REC_NEXT(46, choice)(__VA_ARGS__)
// #define REC_46(choice, ...)   REC_NEXT(47, choice)(__VA_ARGS__)
// #define REC_47(choice, ...)   REC_NEXT(48, choice)(__VA_ARGS__)
// #define REC_48(choice, ...)   REC_NEXT(49, choice)(__VA_ARGS__)
// #define REC_49(choice, ...)   REC_NEXT(50, choice)(__VA_ARGS__)
// #define REC_50(choice, ...)   REC_NEXT(51, choice)(__VA_ARGS__)
// #define REC_51(choice, ...)   REC_NEXT(52, choice)(__VA_ARGS__)
// #define REC_52(choice, ...)   REC_NEXT(53, choice)(__VA_ARGS__)
// #define REC_53(choice, ...)   REC_NEXT(54, choice)(__VA_ARGS__)
// #define REC_54(choice, ...)   REC_NEXT(55, choice)(__VA_ARGS__)
// #define REC_55(choice, ...)   REC_NEXT(56, choice)(__VA_ARGS__)
// #define REC_56(choice, ...)   REC_NEXT(57, choice)(__VA_ARGS__)
// #define REC_57(choice, ...)   REC_NEXT(58, choice)(__VA_ARGS__)
// #define REC_58(choice, ...)   REC_NEXT(59, choice)(__VA_ARGS__)
// #define REC_59(choice, ...)   REC_NEXT(60, choice)(__VA_ARGS__)
// #define REC_60(choice, ...)   REC_NEXT(61, choice)(__VA_ARGS__)
// #define REC_61(choice, ...)   REC_NEXT(62, choice)(__VA_ARGS__)
// #define REC_62(choice, ...)   REC_NEXT(63, choice)(__VA_ARGS__)
